package inge_soft.gestoriusNuevo.business.controller.implementation;

import inge_soft.gestoriusNuevo.business.logic.abstraction.IParserExcepciones;
import inge_soft.gestoriusNuevo.business.service.abstraction.IInstitucionService;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.DomicilioTipificado;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Institucion;
import inge_soft.gestoriusNuevo.support.SecurityUtil;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.springframework.dao.DataAccessException;
import org.zkoss.bind.annotation.AfterCompose;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ExecutionArgParam;
import org.zkoss.bind.annotation.GlobalCommand;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.Sessions;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class CrearModificarInstitucionViewModel {

	@WireVariable("institucionService")
	private IInstitucionService servicioInstitucion;
	
	@WireVariable("parserExcepcionesInstitucion")
	private IParserExcepciones parserExcepciones;
	
	private String tituloVentana;
	private String nombreUsuario;
	private String mensajeEliminarDomicilio;
	
	private Institucion institucionProcesada;
	
	private List<DomicilioTipificado> listaDomiciliosTipificadosInstitucionProcesada;

	private boolean panelDomiciliosDeshabilitado;
	private boolean creando;
	
	@Init
	public void init() {
		nombreUsuario = SecurityUtil.getUserName();
	}
	
	@AfterCompose
	public void doAfterCompose() {
		
		// recibo objects y casteo
		Institucion institucion = (Institucion) Sessions.getCurrent().getAttribute("Institucion");
		
		if (institucion == null) {
			creando = true;
			//DEPURACION
			System.out.println("CREAR Y MODIFICAR INSTITUCION: institucion llego en null");
			//DEPURACION
			this.institucionProcesada = new Institucion();
			this.setListaDomiciliosTipificadosInstitucionProcesada(new ArrayList<DomicilioTipificado>());
			this.setPanelDomiciliosDeshabilitado(true);
			this.setTituloVentana("Creando Institucion");
		} else {
			creando = false;
			this.institucionProcesada = institucion;
			this.setListaDomiciliosTipificadosInstitucionProcesada((List<DomicilioTipificado>) institucion.getDomicilios());
			this.setTituloVentana("Modificando Institucion: " + institucion.getRazonSocial() + " " + institucion.getNombreFantasia());
			this.setPanelDomiciliosDeshabilitado(false);
		}
	}
	
	public boolean getPanelDomiciliosDeshabilitado() {
		return panelDomiciliosDeshabilitado;
	}

	public void setPanelDomiciliosDeshabilitado(boolean panelDomiciliosDeshabilitado) {
		this.panelDomiciliosDeshabilitado = panelDomiciliosDeshabilitado;
	}

	public String getMensajeEliminarDomicilio() {
		return mensajeEliminarDomicilio;
	}

	public void setMensajeEliminarDomicilio(String mensajeEliminarDomicilio) {
		this.mensajeEliminarDomicilio = mensajeEliminarDomicilio;
	}

	public String getTituloVentana() {
		return tituloVentana;
	}

	public void setTituloVentana(String tituloVentana) {
		this.tituloVentana = tituloVentana;
	}
	
	public Institucion getInstitucionProcesada() {
		return institucionProcesada;
	}

	public void setInstitucionProcesada(Institucion institucionProcesada) {
		this.institucionProcesada = institucionProcesada;
	}

	public List<DomicilioTipificado> getListaDomiciliosTipificadosInstitucionProcesada() {
		return listaDomiciliosTipificadosInstitucionProcesada;
	}

	public void setListaDomiciliosTipificadosInstitucionProcesada(
			List<DomicilioTipificado> listaDomiciliosTipificadosInstitucionProcesada) {
		this.listaDomiciliosTipificadosInstitucionProcesada = listaDomiciliosTipificadosInstitucionProcesada;
	}
	
	
	
	
// DOMICILIOS ---------------------------------------------------------------------
	
	
	
	@Command @NotifyChange("mensajeEliminarDomicilio")
	public void deseaEliminarDomicilio() {
		mensajeEliminarDomicilio = "¿Esta seguro que quiere eliminar el domicilio seleccionado?";
	}
	
	@Command @NotifyChange("mensajeEliminarDomicilio")
	public void cancelarEliminarDomicilio() {
		mensajeEliminarDomicilio = null;
	}
	
	@Command
	public void editarDomicilio(@BindingParam("domicilio") DomicilioTipificado domicilioTipificado) {
		Sessions.getCurrent().setAttribute("Institucion", institucionProcesada);
		Sessions.getCurrent().setAttribute("DomicilioTipificado", domicilioTipificado);
		Executions.getCurrent().sendRedirect("index.zul?destino=CrearYmodificarDomicilio.zul","");
	}
	
	@Command @NotifyChange("mensajeEliminarDomicilio")
	public void eliminarDomicilio() {
		mensajeEliminarDomicilio = null;
		// eliminar postaaaaa
	}
	
	@Command
	public void nuevoDomicilio() {
		
		Sessions.getCurrent().setAttribute("Institucion", institucionProcesada);
		Sessions.getCurrent().setAttribute("DomicilioTipificado", null);// Me aseguro de que llegue en null
		Executions.getCurrent().sendRedirect("index.zul?destino=CrearYmodificarDomicilio.zul","");
	}
	
	@Command
	public void cerrar() {
		Executions.getCurrent().sendRedirect("index.zul?destino=MisInstituciones.zul","");
		
	}
	
	@GlobalCommand @NotifyChange("listaDomiciliosTipificadosInstitucionProcesada")
	public void cerraronCrearModificarDomicilio() {
		//DEPURACION
		System.out.println("CERRARON CREAR MODIFICAR DOMICILIO");
		//DEPURACION
		this.setListaDomiciliosTipificadosInstitucionProcesada((List<DomicilioTipificado>) institucionProcesada.getDomicilios());
	}
	
	@Command @NotifyChange("panelDomiciliosDeshabilitado")
	public void guardar() {
		//DEPURACION
		System.out.println("apretase guardar gato!!!");
		//DEPURACION

		try {
			if (creando) { // si estoy creando, creo
				servicioInstitucion.crearInstitucion(nombreUsuario, institucionProcesada);
			} else { // sino, estoy editando y modifico
				servicioInstitucion.modificarInstitucion(nombreUsuario, institucionProcesada);
			}
		} catch(DataAccessException e) {
			Messagebox.show(parserExcepciones.transformar(e.getMessage()));
			return; // return para que no vaya a habilitar el panel de domicilios
		}

		String actividad = (creando) ? "CREO" : "EDITO";
		creando = false;
		String mensajeCorrecto = "La institucion se " + actividad + " correctamente, ahora puede acceder a la pestaña de domicilios";
		//Messagebox.show(mensajeCorrecto);//Cre que no es necesario ya que si no hay domicilios, no deberia poder ingresar a la institucion
		
		if (getPanelDomiciliosDeshabilitado()) { // si el panel de domicilios ESTA DESHABILITADO...
			if (institucionProcesada.getId() != null) { // si la institucion procesada, fue persistida
				setPanelDomiciliosDeshabilitado(false); // habilito el panel de domicilios (SETEO DESHABILITADO EN FALSE)
			}
		}
	}
}
